package com.sxj.corejava.code14_Lambda表达式;

import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;

public class Test06_方法引用 {

    public static void main(String[] args) {
        // 可以将一个已有的方法赋值给对应的函数式接口
        // Consumer<String> c = s -> System.out.println(s);
        // 上述方法可以通过方法引用进行简写
        // 语法   对象::实例方法名
        Consumer<String> c = System.out::println;
        c.accept("Hello World");

        User user = new User();
        // user.setId(1);
        Consumer<Integer> c2 = user::setId;
        c2.accept(1);
        // user.setUsername("admin");
        Consumer<String> c3 = user::setUsername;
        c3.accept("admin");
        // user.setPassword("123456");
        Consumer<String> c4 = user::setPassword;
        c4.accept("123456");

        // System.out.println(user.getId());
        Supplier<Integer> s = user::getId;
        // System.out.println(user.getUsername());
        Supplier<String> s2 = user::getUsername;
        c.accept(s2.get());
        // System.out.println(user.getPassword());
        Supplier<String> s3 = user::getPassword;
        c.accept(s3.get());

        // 静态方法,类名::方法名
        Supplier<String> s4 = User::show;
        c.accept(s4.get());

        Predicate<String> p = "admin"::equals;
        boolean flag = p.test("admin");
        System.out.println(flag);

        // 在某些特殊场景下,可以使用类名::方法名
        // 例如equals方法可以这么做,但是此时需要两个参数
        // 而四大核心函数式接口中的方法均不符合
        BiPredicate<String, String> bp = String::equals;
        flag = bp.test("admin", "admin");
        System.out.println(flag);
    }

}
